import SockJS from 'sockjs-client'
import Stomp from 'stompjs'

export const stompClient = {
  data () {
    return {
      stompClient: null,
      timeout: 15000, // 15s发一次心跳
      timeoutObj: '',
      serverTimeoutObj: '',
      resizeTimer: null
    }
  },
  mounted () {
    // this.connection(this)
  },
  destroyed () {
    // 页面离开时断开连接,清除定时器
    this.disconnect()
    this.resetHeart(this)
  },
  methods: {
    connection (self_) {
      // 建立连接对象
      let socket = new SockJS(locale['wsServerAddr'] + '/websocket-rabbitmq')
      // 获取STOMP子协议的客户端对象
      self_.stompClient = Stomp.over(socket)

      // self_.stompClient.heartbeat.outgoing = 20000 // 客户端每20000ms发送一次心跳检测
      // self_.stompClient.heartbeat.incoming = 0 // client不接收serever端的心跳检测
      // 定义客户端的认证信息,按需求配置
      // 向服务器发起websocket连接
      self_.stompClient.connect({}, self_.connectCallback, self_.errorCallback)
      self_.stompClient.debug = function (str) {
        self_.$bus.emit('poll', new Date())
      }
    },
    disconnect (self_) { // 断开链接
      if (self_.stompClient) {
        self_.stompClient.disconnect()
      }
    },
    connectCallback () {
      let self_ = this
      // self_.heartCheck()
      // 订阅发送到本用户的消息
      self_.stompClient.subscribe('/topic/broadcastMessage', tick => {
        // self_.resetHeart(self_)// 重置任务
        if (tick && tick.body !== null) {
          self_.$bus.emit('broadcastMessage', JSON.parse(tick.body))
        }
      })
    },
    errorCallback (errorCallback) {
      let self_ = this
      // 连接失败的操作...（该方法非必须）
      // console.log(errorCallback)
      if (self_.resizeTimer) {
        clearTimeout(self_.resizeTimer)
      }
      self_.resizeTimer = setTimeout(function () { // 没连接上会一直重连，设置延迟避免请求过多
        self_.connection(self_)
      }, self_.timeout)
    },
    heartCheck () { //
      let self = this
      self.timeoutObj = setTimeout(function () {
        // 这里发送一个心跳到后端指定路由，后端该路径收到将再发一条消息到前端指定路由，从而完成一次交互（消息content可以为空 只要能到达路由就可以）
        self.stompClient.send('/topic/heartbeat', {}, JSON.stringify({'to': '/check/net/'}))
        // console.log('ping!')

        // 如果超过一定时间还没重置才会执行到这，说明后端主动断开了
        self.serverTimeoutObj = setTimeout(function () {
          self.disconnect(self)
          self.connection(self)
        }, self.timeout)
      }, self.timeout)
    },
    resetHeart (self_) {
      clearTimeout(self_.timeoutObj)// 清除定时任务
      clearTimeout(self_.serverTimeoutObj)
    }
  },
  computed: {

  }
}
